package ar.com.larreta.colegio.entidades;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import ar.com.larreta.entidades.Entidad;

@Entity
@Table(name = "item")
// Borrado logico
@SQLDelete (sql="UPDATE Item SET fechaEliminacion=CURRENT_TIMESTAMP WHERE ID=?")
// Solamente trae los que no fueron borrados logicamente
@Where(clause="fechaEliminacion IS NULL")
public class Item extends Entidad {

	private Long id;
	private PlanDePago planDePago;
	private Set<Obligacion> obligaciones;
	
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	@ManyToOne (fetch=FetchType.LAZY)
	@JoinColumn (name="idPlanDePago")
	public PlanDePago getPlanDePago() {
		return planDePago;
	}

	public void setPlanDePago(PlanDePago planDePago) {
		this.planDePago = planDePago;
	}
	

	@OneToMany (mappedBy="item", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	public Set<Obligacion> getObligaciones() {
		//FIXME: Puede ocurrir que traiga obligaciones eliminadas por no tener el where que filtra
		// @Where(clause="fechaEliminacion IS NULL")
		return obligaciones;
	}

	public void setObligaciones(Set<Obligacion> obligaciones) {
		this.obligaciones = obligaciones;
	}
	
	@Transient
	public void agregarObligacion(Obligacion obligacion){
		if (obligaciones == null){
			obligaciones = new HashSet<Obligacion>();
		}
		obligaciones.add(obligacion);
	}
	
	/**
	 * Retorna la Obligacion con vigencia mas actualizada
	 * @return
	 */
	@Transient
	public Obligacion getObligacion() {
		List lista = new ArrayList<Obligacion>(obligaciones);
		Collections.sort(lista);
		
		Obligacion obligacion = null;
		if (!lista.isEmpty()){
			obligacion = (Obligacion) lista.iterator().next();
		}

		return obligacion;
	}

	
	public void setObligacion(Obligacion obligacion) {
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Item) {
			Item item = (Item) obj;
			return this.getId().equals(item.getId());
		}
		return Boolean.FALSE;
	}


	
}
